from folium.plugins import HeatMap
import folium
import pandas as pd

import requests
import json
import pdb
from logzero import logger

AK = ["6guiiaeye2DPqjiLFll8xYIBKE7dH913"]

def coord_trans(lngs, lats, cfrom, cto):
    '''
    坐标转换
    输入经纬度: 
        coords: a list of coords  [(lng1,lat1),(lng2,lat2),...]
        cfrom and cto:
            - 1：GPS设备获取的角度坐标，WGS84坐标;
            - 2：GPS获取的米制坐标、sogou地图所用坐标;
            - 3：google地图、soso地图、aliyun地图、mapabc地图和amap地图所用坐标，国测局（GCJ02）坐标;
            - 4：3中列表地图坐标对应的米制坐标;
            - 5：百度地图采用的经纬度坐标;
            - 6：百度地图采用的米制坐标;
            - 7：mapbar地图坐标;
            - 8：51地图坐标
    '''
    errer_msg = {
        1:"内部错误",
        4:"转换失败    X→GPS时必现，根据法律规定，不支持将任何类型的坐标转换为GPS坐标",
        21:"输入类型非法",
        22:"输出类型非法",
        24:"坐标格式非法格式非法",
        25:"坐标个数非法，超过限制",
        26:"参数错误",
    }
    batchSize = 50
    allSize = len(lngs)
    new_lngs,new_lats = [],[]
    for n in range(0,allSize//batchSize+1):
        batchLng, batchLat = lngs[n*batchSize:(n+1)*batchSize],lats[n*batchSize:(n+1)*batchSize]

        coord_str = ";".join(["{},{}".format(lng,lat) for lng, lat in zip(batchLng, batchLat)])
        query_url = "http://api.map.baidu.com/geoconv/v1/?coords={}&from={}&to={}&ak={}".format(
            coord_str, 
            cfrom,
            cto,
            AK[0]
        )
        json_msg = json.loads(requests.get(query_url).text)

        if json_msg["status"]==0:
            new_lngs.extend([rc["x"] for rc in json_msg["result"]])
            new_lats.extend([rc["y"] for rc in json_msg["result"]])

    return new_lngs,new_lats

def plotHeatMap():
    risk_data = []
    pdrisk = pd.read_csv("result/risk_last.csv")
    glngs,glats = coord_trans(pdrisk["lng"].tolist(),pdrisk["lat"].tolist(),5,3)
    for lng,lat,risk in zip(glngs,glats,pdrisk["risk"]):
        risk_data.append((lat+0.002,lng-0.005,risk))
    heat_m = folium.Map(
        location=[23.0866291698,113.3120138774],
        tiles='stamenwatercolor',
        # tiles='Stamen Toner',
        zoom_start=13.2
    )
    HeatMap(
        risk_data,
        radius=4,
        max_val=1.,
        blur=2,
    ).add_to(heat_m)

    heat_m.save("result/heatmap.html")
    logger.info("输出的热力图保存在：result/heatmap.html")

if __name__ == "__main__":
    plotHeatMap()